{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cal_pairwise_dist(x):\n",
    "    # '''计算pairwise 距离, x是matrix\n",
    "    # (a-b)^2 = a^2 + b^2 - 2*a*b\n",
    "    # '''\n",
    "    sum_x = np.sum(np.square(x), 1)\n",
    "    # print -2 * np.dot(x, x.T)\n",
    "    # print np.add(-2 * np.dot(x, x.T), sum_x).T\n",
    "    dist = np.add(np.add(-2 * np.dot(x, x.T), sum_x).T, sum_x)\n",
    "    #返回任意两个点之间距离的平方\n",
    "    return dist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cal_perplexity(dist, idx=0, beta=1.0):\n",
    "    # '''计算perplexity, D是距离向量，\n",
    "    # idx指dist中自己与自己距离的位置，beta是高斯分布参数\n",
    "    # 这里的perp仅计算了熵，方便计算\n",
    "    # '''\n",
    "    prob = np.exp(-dist * beta)\n",
    "    # 设置自身prob为0\n",
    "    prob[idx] = 0\n",
    "    sum_prob = np.sum(prob)\n",
    "    if sum_prob == 0:\n",
    "        prob = np.maximum(prob, 1e-12)\n",
    "        perp = -12\n",
    "    else:\n",
    "        perp = np.log(sum_prob) + beta * np.sum(dist * prob) / sum_prob\n",
    "        prob /= sum_prob\n",
    "    #困惑度和pi\\j的概率分布\n",
    "    return perp, prob"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [],
   "source": [
    "def seach_prob(x, tol=1e-5, perplexity=30.0):\n",
    "    # '''二分搜索寻找beta,并计算pairwise的prob\n",
    "    # '''\n",
    "    # 初始化参数\n",
    "    print(\"Computing pairwise distances...\")\n",
    "    (n, d) = x.shape\n",
    "    dist = cal_pairwise_dist(x)\n",
    "    pair_prob = np.zeros((n, n))\n",
    "    beta = np.ones((n, 1))\n",
    "    # 取log，方便后续计算\n",
    "    base_perp = np.log(perplexity)\n",
    "\n",
    "    for i in range(n):\n",
    "        if i % 500 == 0:\n",
    "            print(\"Computing pair_prob for point %s of %s ...\" %(i,n))\n",
    "\n",
    "        betamin = -np.inf\n",
    "        betamax = np.inf\n",
    "        #dist[i]需要换不能是所有点\n",
    "        perp, this_prob = cal_perplexity(dist[i], i, beta[i])\n",
    "\n",
    "        # 二分搜索,寻找最佳sigma下的prob\n",
    "        perp_diff = perp - base_perp\n",
    "        tries = 0\n",
    "        while np.abs(perp_diff) > tol and tries < 50:\n",
    "            if perp_diff > 0:\n",
    "                betamin = beta[i].copy()\n",
    "                if betamax == np.inf or betamax == -np.inf:\n",
    "                    beta[i] = beta[i] * 2\n",
    "                else:\n",
    "                    beta[i] = (beta[i] + betamax) / 2\n",
    "            else:\n",
    "                betamax = beta[i].copy()\n",
    "                if betamin == np.inf or betamin == -np.inf:\n",
    "                    beta[i] = beta[i] / 2\n",
    "                else:\n",
    "                    beta[i] = (beta[i] + betamin) / 2\n",
    "\n",
    "            # 更新perb,prob值\n",
    "            perp, this_prob = cal_perplexity(dist[i], i, beta[i])\n",
    "            perp_diff = perp - base_perp\n",
    "            tries = tries + 1\n",
    "        # 记录prob值\n",
    "        pair_prob[i,] = this_prob\n",
    "    print(\"Mean value of sigma: \", np.mean(np.sqrt(1 / beta)))\n",
    "    #每个点对其他点的条件概率分布pi\\j\n",
    "    return pair_prob"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [],
   "source": [
    "#使用tensorflow实现T-SNE\n",
    "tf.reset_default_graph()\n",
    "\n",
    "def tsne(data, no_dims=2, initial_dims=50, perplexity=30.0, max_iter=800):\n",
    "    (n, d) = data.shape\n",
    "    print(n,d)\n",
    "    \n",
    "    # 对称化\n",
    "    P = seach_prob(data, 1e-5, perplexity)\n",
    "    P = P + np.transpose(P)\n",
    "    P = P / np.sum(P)   #pij\n",
    "    P = np.maximum(P, 1e-12)\n",
    "    # 随机初始化Y y = np.random.randn(n, no_dims)\n",
    "    # tf.random_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32)\n",
    "    \n",
    "    X = tf.placeholder(name=\"X\", dtype=tf.float32, shape=[n,n])\n",
    "    \n",
    "    Y = tf.get_variable(name = \"Y\", shape=[n, no_dims],  \n",
    "                        initializer =tf.random_normal_initializer())\n",
    "    \n",
    "    sum_y = tf.reduce_sum(tf.square(Y), 1)\n",
    "    temp = tf.add(tf.transpose(tf.add(-2*tf.matmul(Y, tf.transpose(Y)), sum_y)), sum_y)\n",
    "    num = tf.divide(1,1 + temp)\n",
    "    # 不知道这句能不能执行\n",
    "    one_ = tf.constant([x for x in range(n)])\n",
    "    one_hot = tf.one_hot(one_, n)\n",
    "    num = num - num*one_hot\n",
    "    \n",
    "    Q = num/tf.reduce_sum(num)\n",
    "    Q = tf.maximum(Q, 1e-12)\n",
    "    \n",
    "    learning_rate = 500\n",
    "    loss = tf.reduce_sum(X*tf.log(tf.divide(X,Q)))\n",
    "    \n",
    "    optimizer = tf.train.AdagradOptimizer(learning_rate=learning_rate)\n",
    "    train_op = optimizer.minimize(loss)\n",
    "    \n",
    "    init = tf.global_variables_initializer()\n",
    "    print(\"begin\")\n",
    "    with tf.Session() as sess:\n",
    "        init.run()\n",
    "        for iter in range(max_iter):\n",
    "            sess.run(train_op, feed_dict={X:P})\n",
    "            if iter%50 == 0:\n",
    "                l = sess.run(loss, feed_dict={X:P})\n",
    "                print(\"%d\\t%f\"%(iter, l))\n",
    "        y = sess.run(Y)\n",
    "    print(\"finished\")\n",
    "\n",
    "    return y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_digits\n",
    "data = load_digits().data\n",
    "label = load_digits().target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1797, 64)\n"
     ]
    }
   ],
   "source": [
    "print(data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1797 64\n",
      "Computing pairwise distances...\n",
      "Computing pair_prob for point 0 of 1797 ...\n",
      "Computing pair_prob for point 500 of 1797 ...\n",
      "Computing pair_prob for point 1000 of 1797 ...\n",
      "Computing pair_prob for point 1500 of 1797 ...\n",
      "Mean value of sigma:  11.698543429042957\n",
      "begin\n",
      "0\t4.026670\n",
      "50\t1.573123\n",
      "100\t1.308106\n",
      "150\t1.193452\n",
      "200\t1.124338\n",
      "250\t1.077835\n",
      "300\t1.042654\n",
      "350\t1.015760\n",
      "400\t0.993758\n",
      "450\t0.975636\n",
      "500\t0.960953\n",
      "550\t0.948676\n",
      "600\t0.937571\n",
      "650\t0.928422\n",
      "700\t0.920210\n",
      "750\t0.912854\n",
      "finished\n"
     ]
    }
   ],
   "source": [
    "data_2d = tsne(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7f88b83cea58>"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(data_2d[:,0], data_2d[:,1], 20, label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.         0.14764436 0.19822931 0.24899329 0.8401241 ]\n",
      " [0.14764436 0.         0.07773452 0.06620658 0.11568879]\n",
      " [0.19822931 0.07773452 0.         0.53903073 0.16772479]\n",
      " [0.24899332 0.06620658 0.5390307  0.         0.24206233]\n",
      " [0.840124   0.11568879 0.16772479 0.24206233 0.        ]]\n",
      "[[-6.6375798e-01  1.4153293e-01]\n",
      " [-1.0055504e+00  2.5198119e+00]\n",
      " [ 1.3423599e+00 -4.2939713e-04]\n",
      " [ 8.1892943e-01 -7.6279569e-01]\n",
      " [-8.7212080e-01 -2.4172336e-01]]\n"
     ]
    }
   ],
   "source": [
    "tf.reset_default_graph()\n",
    "n = 5\n",
    "no_dims = 2\n",
    "\n",
    "Y = tf.get_variable(name = \"Y\", shape=[n, no_dims],  \n",
    "                    initializer =tf.random_normal_initializer())\n",
    "\n",
    "sum_y = tf.reduce_sum(tf.square(Y), 1)\n",
    "temp = tf.add(tf.transpose(tf.add(-2*tf.matmul(Y, tf.transpose(Y)), sum_y)), sum_y)\n",
    "num = tf.divide(1,1 + temp)\n",
    "\n",
    "\n",
    "\n",
    "init = tf.global_variables_initializer()\n",
    "with tf.Session() as sess:\n",
    "    init.run()\n",
    "    y = sess.run(Y)\n",
    "    res = sess.run(num)\n",
    "print(res)\n",
    "print(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.2146595214266235\n"
     ]
    }
   ],
   "source": [
    "a = np.array([2.0593538, 1.5450652 ])\n",
    "b = np.array([0.8975018, 0.02564423])\n",
    "print(1/(1+np.sum((a-b)**2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
